﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.MobileControls;
using IrendilDLL;
using Irendil.controls;
using IrendilDLL.Database;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using IrendilDLL.PageControls;
using IrendilDLL.utilities;
using AjaxControlToolkit;

namespace Irendil
{
    public partial class AutoRoutingQueue : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {

                // Procedo solo se é correttamente inizializzata la variabile di sessione
                String installationGUID = (String)Session["installationGUID"];
                if (installationGUID != "" || installationGUID != String.Empty)
                {
                    // Recupero le informazioni relativa al nodo dell'installazione selezionato
                    List<InstallationNode> installationNodeList = (List<InstallationNode>)Session["installationNodeList"];
                    InstallationNode installationNodeActive = null;
                    foreach (InstallationNode installationNode in installationNodeList)
                    {
                        if (installationNode.GUID == installationGUID)
                            installationNodeActive = installationNode;
                    }
                    // Se come devo trovo il nodo attivo vado avanti
                    if (installationNodeActive != null)
                    {
                        // Istanzio la classe di controllo


                        if (!IsPostBack)
                        {

                            System.Web.UI.WebControls.Label labelMessageOut = (System.Web.UI.WebControls.Label)Master.Master.FindControl("LabelMessageOut");
                            labelMessageOut.Text = "Connesso a <b>" + installationNodeActive.Description+"</b>";

                            // Imposto le date di default nel filterBar
                            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
                            filterBar.setFromDate(System.DateTime.Now);
                            filterBar.setToDate(System.DateTime.Now);

                            // Ottengo la stringa di connessione al db
                            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
                            // Istanzio la classe di appoggio al DB Irendil
                            IrendilDbManager irendilDbManager = new IrendilDbManager(localSqlServerStr);
                            irendilDbManager.populateHostsDropDownList(filterBar.getHostDropDownList(), installationGUID);

                            // Ottengo e visualizzo gli eventi prelevati da DB
                            getAndViewDbData(filterBar, localSqlServerStr);
                        }

                        if (IsPostBack)
                        {
                            
                        }

                        // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in postbak)
                        ((filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar")).SearchButton.Click += new EventHandler(this.searchButton_Click);

                        // Collego l'evento click della filterbar con il metodo di gestione evento (ripetuto in postbak)
                        ((refreshBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("refreshBar")).RefreshButton.Click += new EventHandler(this.refreshButton_Click);


                    }

                }
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // In caso di sessione scaduta o altro redirigo alla pagina di login
                Response.Redirect("~//Logout.aspx");
            }

        }

        /// <summary>
        /// Metodo che preleva da DB gli eventi e li visualizza opportunamente
        /// </summary>
        /// <param name="filterBar">rif alla barra di filtraggio</param>
        /// <param name="localSqlServerStr">rif alla stringa di connessione al DB</param>
        private void getAndViewDbData(filterBar filterBar, string localSqlServerStr)
        {
            // Prelevo i dati da DB
            try
            {
                // Ottengo l'host selezionato
                String hostSelected = filterBar.getHostDropDownList().SelectedValue;


                // Istanzio la classe di controllo
                AutoRoutingQueueControl autoRoutingQueueControl = new AutoRoutingQueueControl();
                DataTable dt = autoRoutingQueueControl.getQueueDT(hostSelected, filterBar.getFromDate(), filterBar.getToDate());

                //// Salvo i dati in cache per evitare troppi round-trip su DB
                //Cache["DataTable"] = dt;
                // Imposto la sorgente dati
                autoRoutingQueueGridView.DataSource = dt;
                // Eseguo il bind dei dati (visualizzazione)
                autoRoutingQueueGridView.DataBind();
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();
            }
        }

        /// <summary>
        /// Evento associato alla pressione del tasto search
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void searchButton_Click(object sender, EventArgs e)
        {
            // Ottengo il riferimento a filterBar
            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
            // Ottengo la stringa di connessione al db
            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Ottengo e visualizzo gli eventi prelevati da DB
            getAndViewDbData(filterBar, localSqlServerStr);
        }

        /// <summary>
        /// Evento associato alla pressione del tasto refresh
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void refreshButton_Click(object sender, EventArgs e)
        {
            try
            {
                // Ottengo il riferimento alla executeBar e filterBar
                filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");

                String storeSelected = "sp_importARQueues";
                String hostSelected = "";
                // Ottengo i valori impostati
                hostSelected = ((DropDownList)(filterBar.getHostDropDownList())).SelectedValue;

                // Istanzio la classe di controllo
                MonitorSPControl monitorSPControl = new MonitorSPControl();
                monitorSPControl.executeImportSP(storeSelected, hostSelected);

                // Ottengo la stringa di connessione al db
                string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
                // Aggiorno e visualizzo gli eventi prelevati da DB
                getAndViewDbData(filterBar, localSqlServerStr);
            }
            catch (Exception ex)
            {
                //// Onde evitare di perdere eccezioni riscivo l'errore su file anche se creo duplicati
                // Istanzio la classe di gestione dell'errore
                LogErrors logError = new LogErrors();
                // Scrivo l'errore su file
                logError.WriteLogToFile(ex.Source+": "+ex.Message);
                // Visualizzo la finestra di errore
                ((ModalPopupExtender)Master.Master.FindControl("ModalPopupExtender")).Show();

            }
        }

        /// <summary>
        /// Evento associato al cambio pagina nella gridview
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void autoRoutingQueueGridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //// Imposto il nuovo valore di pagina
            //autoRoutingQueueGridView.PageIndex = e.NewPageIndex;
            //// Prelevo da cache il DT
            //autoRoutingQueueGridView.DataSource = (DataTable)Cache["DataTable"];
            //// Effetto la visualizzazione dei dati
            //autoRoutingQueueGridView.DataBind();

            // Imposto le date di default nel filterBar
            filterBar filterBar = (filterBar)Master.Master.FindControl("ContentPlaceHolder").FindControl("filterBar");
            // Ottengo la stringa di connessione al db
            string localSqlServerStr = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString;
            // Ottengo e visualizzo gli eventi prelevati da DB
            getAndViewDbData(filterBar, localSqlServerStr);

            autoRoutingQueueGridView.PageIndex = e.NewPageIndex;
            autoRoutingQueueGridView.DataBind();
        }
    }
}
